/**
 * 平台检测工具 - 核心工具类
 * 用于判断当前运行环境，为一码多端提供基础支持
 */

// 平台类型常量
export const PLATFORM_TYPES = {
  WEB: 'web',             // PC端Web
  H5: 'h5',               // 移动端H5
  MP_WEIXIN: 'mp-weixin', // 微信小程序
  APP: 'app'              // App应用
}

// 存储当前平台类型
let currentPlatform = null

/**
 * 初始化平台检测
 * 此函数应在应用启动时调用
 */
export function initPlatform() {
  if (currentPlatform) return
  
  // 微信小程序环境检测
  if (typeof wx !== 'undefined' && wx.getSystemInfoSync) {
    currentPlatform = PLATFORM_TYPES.MP_WEIXIN
  }
  // App环境检测 (这里以常见的App内置WebView标识为例)
  else if (typeof navigator !== 'undefined' && 
           (navigator.userAgent.includes('AppName') || 
            window.__isApp__ === true)) {
    currentPlatform = PLATFORM_TYPES.APP
  }
  // 移动端H5检测
  else if (typeof navigator !== 'undefined' && 
           /mobile|android|ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())) {
    currentPlatform = PLATFORM_TYPES.H5
  }
  // 默认视为PC端Web
  else {
    currentPlatform = PLATFORM_TYPES.WEB
  }
  
  // 将平台信息挂载到window，方便全局访问
  window.$platform = currentPlatform
}

/**
 * 获取当前平台类型
 * @returns {string} 平台类型
 */
export function getPlatformType() {
  if (!currentPlatform) {
    initPlatform()
  }
  return currentPlatform
}

/**
 * 判断是否为PC端Web
 * @returns {boolean} 是否为PC端Web
 */
export function isWeb() {
  return getPlatformType() === PLATFORM_TYPES.WEB
}

/**
 * 判断是否为移动端H5
 * @returns {boolean} 是否为移动端H5
 */
export function isH5() {
  return getPlatformType() === PLATFORM_TYPES.H5
}

/**
 * 判断是否为微信小程序
 * @returns {boolean} 是否为微信小程序
 */
export function isMpWeixin() {
  return getPlatformType() === PLATFORM_TYPES.MP_WEIXIN
}

/**
 * 判断是否为App环境
 * @returns {boolean} 是否为App环境
 */
export function isApp() {
  return getPlatformType() === PLATFORM_TYPES.APP
}

/**
 * 平台特定操作执行器
 * 根据当前平台执行对应操作
 * @param {Object} actions - 平台操作映射
 * @param {Function} defaultAction - 默认操作
 */
export function executeByPlatform(actions, defaultAction) {
  const platform = getPlatformType()
  if (actions[platform]) {
    return actions[platform]()
  }
  if (defaultAction) {
    return defaultAction()
  }
}
